import { RouteObject } from '@/router/interface'

export const getRoute = (path: string, routes: RouteObject[] = [], prefix = ''): RouteObject => {
  let result: RouteObject = {}
  //递归遍历
  for (let item of routes) {
    //迭代每次的path
    const currentPath = prefix + item.path
    if (prefix + item.path === path) {
      //如果找到了path一样，继续判断子路由有没有index，如果有index返回index的路由，否则返回当前路由
      if (item.children) {
        for (let child of item.children) if (child.index) return child
      }
      return item
    }
    //判断当前节点是否是目标节点的父辈，如果不是就跳出去，大大节省递归到底层才能找到的时间复杂度
    if (item.children && new RegExp(`^${currentPath}`).test(path)) {
      const res = getRoute(path, item.children, currentPath + '/')
      if (Object.keys(res).length) result = res
    }
  }
  return result
}
export const getMatched = (
  path: string,
  //当前层级的路由
  routes: RouteObject[] = [],
  //迭代的前缀
  prefix = '',
  //当前路由的matched
  matched: RouteObject[] = [],
  //引用类型，使得在递归时外层函数能在子函数查到数据后改变flag时也能通过这个引用类型获取已经找到这个信号量
  flag = { isFound: false }
): RouteObject[] => {
  //递归遍历
  for (let item of routes) {
    //开局先添加
    matched.push(item)
    //迭代每次的path
    const currentPath = prefix + item.path
    if (currentPath === path) {
      //如果找到了path一样，继续判断子路由有没有index，如果有index返回index的路由，否则返回当前路由
      if (item.children) {
        for (let child of item.children) {
          if (child.index) {
            flag.isFound = true
            //如果是主页(主页没有path，但也算一个节点)，所以也追加这个节点到matched
            matched.push(child)
            return matched
          }
        }
      }
      //找到了，把引用类型改变，告诉外部函数我已经找到了不用继续了
      flag.isFound = true
      return matched
    }
    //判断当前节点是否是目标节点的父辈，如果不是就跳出去，大大节省递归到底层才能找到的时间复杂度
    if (item.children && new RegExp(`^${currentPath}`).test(path)) {
      getMatched(path, item.children, currentPath + '/', matched, flag)
      if (flag.isFound) return matched
    }
    //一轮过后还没有找到就删除
    matched.pop()
  }
  return matched
}
